Работа с read view через модуль CRUD¶
Представления для чтения позволяют получать данные с помощью CRUD-операций read_view_object:select() и read_view_object:pairs().
В этом руководстве описано, как с помощью модуля CRUD открыть представление для чтения,
получить данные из этого представления с помощью операций select и pairs, а затем закрыть его.
Подробные примеры использования операций select и pairs вместе с read view приведены в разделе Фильтрация и итерация в read view с помощью CRUD.
Для выполнения примеров из этого руководства требуется настроенный кластер с подготовленными данными. Чтобы подготовить стенд, используйте инструкцию из раздела Фильтрация и итерация в read view с помощью CRUD.
Руководство включает следующие шаги:
Создание представления для чтения¶
Чтобы создать read view, вызовите функцию crud.readview():
rv = crud.readview({ name = 'rv', timeout = 3 })
Здесь:
name: название read view;timeout: время ожиданияvshard.callв секундах.
Фильтрация кортежей¶
Как и crud.select, метод read_view_object:select() рассматривает кластер как единый спейс и поддерживает
выбор с множественными условиями.
Получить выборку кортежей из спейса можно с помощью метода read_view_object:select().
В примере ниже возвращаются все кортежи спейса с помощью параметра fullscan:
rv:select('customers', nil, { batch_size = 1, fullscan = true })
---
- metadata: [ { 'name': 'id', 'type': 'integer' }, { 'name': 'bucket_id', 'type': 'unsigned' },
{ 'name': 'name', 'type': 'string' }, { 'name': 'surname', 'type': 'string' }, { 'name': 'age',
'type': 'number' } ]
rows:
- [ 1, 12477, 'Elizabeth', 'Bagnall', 12 ]
- [ 2, 21401, 'Mary', 'Bowman', 46 ]
- [ 3, 11804, 'David', 'Bradley', 33 ]
..............
- [39, 6507, 'Oliver', 'Lowe', 39]
- [40, 6292, 'Evelyn', 'Mishra', 20]
- null
...
Здесь:
customers– название спейса;nil– условия фильтрации кортежей;batch_size– количество кортежей, которое будет обработано за раз запросом к хранилищу;fullscan– полное сканирование спейса.
Теперь поменяйте данные в спейсе, вставив новый кортеж.
В спейсе уже есть кортеж с id = 8, так что в конец будет добавлен новый кортеж с id = 41:
crud.insert('customers', { 8, box.NULL, 'Elizabeth', 23 })
---
- rows:
- [ 41, 25201, 'Elizabeth', 'Born', 23 ]
metadata: [ { 'name': 'id', 'type': 'integer' }, { 'name': 'bucket_id', 'type': 'unsigned' },
{ 'name': 'name', 'type': 'string' }, { 'name': 'surname', 'type': 'string' }, { 'name': 'age',
'type': 'number' } ]
- null
...
Read view содержит снимок данных, полученный перед вставкой кортежа.
Чтобы проверить это, вызовите операцию select еще раз:
rv:select('customers', nil, { batch_size = 1, fullscan = true })
---
- metadata: [ { 'name': 'id', 'type': 'integer' }, { 'name': 'bucket_id', 'type': 'unsigned' },
{ 'name': 'name', 'type': 'string' }, { 'name': 'surname', 'type': 'string' }, { 'name': 'age',
'type': 'number' } ]
rows:
- [ 1, 12477, 'Elizabeth', 'Bagnall', 12 ]
- [ 2, 21401, 'Mary', 'Bowman', 46 ]
- [ 3, 11804, 'David', 'Bradley', 33 ]
..............
- [39, 6507, 'Oliver', 'Lowe', 39]
- [40, 6292, 'Evelyn', 'Mishra', 20]
- null
...
Действительно, в снимке нет нового кортежа с id = 41.
Фильтрация с условием¶
Условия выборки для read_view_object:select() совпадают с условиями crud.select.
В примере ниже показано, как просмотреть пять первых покупателей, которым меньше или ровно 35 лет:
rv:select('customers', { { '<=', 'age', 35 } }, { first = 5 })
---
- metadata: [ { 'name': 'id', 'type': 'integer' }, { 'name': 'bucket_id', 'type': 'unsigned' },
{ 'name': 'name', 'type': 'string' }, { 'name': 'surname', 'type': 'string' }, { 'name': 'age',
'type': 'number' } ]
rows:
- [ 5, 1172, 'Jack', 'Brown', 35 ]
- [ 24, 16559, 'Ethan', 'Walmsley', 34 ]
- [ 16, 11089, 'Emma', 'Hodges', 33 ]
- [ 3, 11804, 'David', 'Bradley', 33 ]
- [ 36, 27087, 'Harper', 'Iqbal', 32 ]
- null
Здесь:
customers– название спейса;{ '<=', 'age', 35 }– условия фильтрации кортежей;first– максимальное количество возвращаемых кортежей.
Итерация с помощью pairs¶
Для итерации по распределенному спейсу используется метод read_view_object:pairs().
В примере в таблицу записаны кортежи для первых пяти покупателей, которым меньше или ровно 35 лет:
tuples = {}
for _, tuple in rv:pairs('customers', { { '<=', 'age', 35 } }, { first = 5}) do
table.insert(tuples, tuple)
end
tuples
Вывод выглядит так:
---
- - [ 5, 1172, 'Jack', 'Brown', 35 ]
- [ 24, 16559, 'Ethan', 'Walmsley', 34 ]
- [ 16, 11089, 'Emma', 'Hodges', 33 ]
- [ 3, 11804, 'David', 'Bradley', 33 ]
- [ 36, 27087, 'Harper', 'Iqbal', 32 ]
...
Чтобы итерироваться по объектам или плоским кортежам, используйте параметр use_tomap со значением true.
В примере в таблицу записаны в виде объектов первые пять покупателей, которым меньше или ровно 35 лет:
objects = {}
for _, object in rv:pairs('customers', { { '<=', 'age', 35 } }, { first = 5, use_tomap = true }) do
table.insert(objects, object)
end
objects
Вывод выглядит так:
---
- - bucket_id: 1172
id: 5
surname: Brown
age: 35
name: Jack
- bucket_id: 16559
id: 24
surname: Walmsley
age: 34
name: Ethan
- bucket_id: 11089
id: 16
surname: Hodges
age: 33
name: Emma
- bucket_id: 11804
id: 3
surname: Bradley
age: 33
name: David
- bucket_id: 27087
id: 36
surname: Iqbal
age: 32
name: Harper
...
Закрытие read view¶
Представления для чтения могут занимать значительный объем памяти. Если read view больше не требуется, закройте его с помощью метода read_view_object:close():
rv:close({ timeout = 3 })
Здесь:
timeout: время ожиданияvshard.callв секундах.
Если не закрыть read view таким образом, он закроется неявно, когда сборщик мусора Lua соберет объект read view.
После закрытия read view его статус меняется на closed.
Попытка использовать закрытый read view вызовет ошибку.